
/**
 * 
 * 优秀学员统计
 * 
 * 题目描述

公司某部门软件教导团正在组织新员工每日打卡学习活动，他们开展这项学习活动已经一个月了，所以想统计下这个月优秀的打卡员工。每个员工会对应一个id，每天的打卡记录记录当天打卡员工的id集合，一共30天。

请你实现代码帮助统计出打卡次数top5的员工。加入打卡次数相同，将较早参与打卡的员工排在前面，如果开始参与打卡的时间还是一样，将id较小的员工排在前面。

注：不考虑并列的情况，按规则返回前5名员工的id即可，如果当月打卡的员工少于5个，按规则排序返回所有有打卡记录的员工id。

输入描述
第一行输入为新员工数量N，表示新员工编号id为0到N-1，N的范围为[1,100]

第二行输入为30个整数，表示每天打卡的员工数量，每天至少有1名员工打卡。

之后30行为每天打卡的员工id集合，id不会重复。

输出描述
按顺序输出打卡top5员工的id，用空格隔开。

用例
输入	11
4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2
0 1 7 10
0 1 6 10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
6 10
7 10
输出	10 0 1 7 6
说明	员工编号范围为0~10，id为10的员工连续打卡30天，排第一，id为0,1,6,7的员工打卡都是两天，id为0,1,7的员工在第一天就打卡，比id为6的员工早，排在前面，0,1,7按id升序排列，所以输出[10,0,1,7,6]
输入	7
6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
输出	0 1 2 3 4
说明	员工编号范围为0-6，id为0，1，2，3，4，5的员工打卡次数相同，最早开始打卡的时间也一样，所以按id升序返回前5个id
输入	2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0 1
0 1
输出	1 0
说明	只有两名员工参与打卡，按规则排序输出两名员工的id

 */

import java.util.HashMap;
import java.util.Scanner;
import java.util.StringJoiner;

/**
  * 题目解析
简单排序题。需要注意的是，排序要素需要记录每个员工第一次打卡日期，作为第二优先级排序。
  */
public class 优秀学员统计 {
    
    public static void main(String[] args) {
    

        Scanner sc = new Scanner(System.in);
 
        int n = sc.nextInt();
 
        int[] count = new int[30];
        for (int i = 0; i < 30; i++) {
            count[i] = sc.nextInt();
        }
 
        // key记录员工id, value记录员工打卡天数
        HashMap<Integer, Integer> freq = new HashMap<>();
        // key记录员工id，value记录员工第一次打卡是哪天
        HashMap<Integer, Integer> first = new HashMap<>();
 
        for (int i = 0; i < 30; i++) {
            for (int j = 0; j < count[i]; j++) {
                int id = sc.nextInt();
 
                freq.put(id, freq.getOrDefault(id, 0) + 1);
                first.putIfAbsent(id, i);
            }
        }
 
        StringJoiner sj = new StringJoiner(" ");
 
        freq.keySet().stream().sorted((idA, idB) -> {
            int freqA = freq.get(idA);
            int freqB = freq.get(idB);
 
            // 打卡天数多的员工排在前面
            if (freqA != freqB) {
                return freqB - freqA;
            }
 
            int firstA = first.get(idA);
            int firstB = first.get(idB);
 
            if (firstA != firstB) {
                // 首次打卡早的员工排在前面
                return firstA - firstB;
            } else {
                // id小的员工排在前面
                return idA - idB;
            }
        }).limit(5).forEach(id -> sj.add(id + "")); // 取打卡前5名
 
        System.out.println(sj);
    }
}
